
package cn.iocoder.yudao.module.apijson.framework;

import apijson.JSON;
import apijson.StringUtil;
import lombok.Getter;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.Map;

/**
 * base model for reduce model codes
 *
 * @author Lemon
 * @use extends BaseModel
 */
@Getter
public abstract class BaseModel implements Serializable {
    private static final long serialVersionUID = 1L;

    private Long id;       //主键，唯一标识
    private Long userId;   //对应User表中的id，外键
    private String date;   //创建时间，JSON没有Date,TimeStamp类型，都会被转成Long，不能用！

    public BaseModel setId(Long id) {
        this.id = id;
        return this;
    }

    public BaseModel setUserId(Long userId) {
        this.userId = userId;
        return this;
    }

    public BaseModel setDate(String date) {
        this.date = date;
        return this;
    }


    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }


    /**
     * 获取当前时间戳
     *
     */
    public static Timestamp currentTimeStamp() {
        return new Timestamp(new Date().getTime());
    }

    /**
     * 获取时间戳 TODO 判空？ 还是要报错？
     */
    public static Timestamp getTimeStamp(String time) {
        return Timestamp.valueOf(time);
    }

    /**
     * 获取时间毫秒值 TODO 判空？ 还是要报错？
     */
    public static long getTimeMillis(String time) {
        return StringUtil.isEmpty(time, true) ? 0 : getTimeStamp(time).getTime();
    }


    //判断是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    /**
     * 判断array是否为空
     */
    public static <T> boolean isEmpty(T[] array) {
        return array == null || array.length <= 0;
    }

    /**
     * 判断collection是否为空
     */
    public static boolean isEmpty(Collection<?> collection) {
        return collection == null || collection.isEmpty();
    }

    /**
     * 判断map是否为空
     */
    public static boolean isEmpty(Map<?, ?> map) {
        return map == null || map.isEmpty();
    }
    //判断是否为空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    //判断是否包含 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    /**
     * 判断array是否包含a
     */
    public static <T> boolean isContain(T[] array, T a) {
        return array == null ? false : Arrays.asList(array).contains(a);
    }

    /**
     * 判断collection是否包含object
     */
    public static <T> boolean isContain(Collection<T> collection, T object) {
        return collection != null && collection.contains(object);
    }

    /**
     * 判断map是否包含key
     */
    public static <K, V> boolean isContainKey(Map<K, V> map, K key) {
        return map != null && map.containsKey(key);
    }

    /**
     * 判断map是否包含value
     */
    public static <K, V> boolean isContainValue(Map<K, V> map, V value) {
        return map != null && map.containsValue(value);
    }
    //判断是否为包含 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>


    //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    /**
     * 获取数量
     */
    public static <T> int count(T[] array) {
        return array == null ? 0 : array.length;
    }

    /**
     * 获取数量
     */
    public static int count(Collection<?> collection) {
        return collection == null ? 0 : collection.size();
    }

    /**
     * 获取数量
     */
    public static int count(Map<?, ?> map) {
        return map == null ? 0 : map.size();
    }
    //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>


    //获取集合长度 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    /**
     * 获取
     */
    public static <T> T get(T[] array, int position) {
        return position < 0 || position >= count(array) ? null : array[position];
    }

    /**
     * 获取
     */
    @SuppressWarnings("unchecked")
    public static <T> T get(Collection<T> collection, int position) {
        return collection == null ? null : (T) get(collection.toArray(), position);
    }

    /**
     * 获取
     *
     * @param <K>
     * @param <V>
     * @param map null ? null
     * @param key null ? null : map.get(key);
     * @return
     */
    public static <K, V> V get(Map<K, V> map, K key) {
        return key == null || map == null ? null : map.get(key);
    }
    //获取集合长度 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>


    //获取非基本类型对应基本类型的非空值 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    /**
     * 获取非空值
     */
    public static boolean value(Boolean value) {
        return value != null && value;
    }

    /**
     * 获取非空值
     */
    public static int value(Integer value) {
        return value == null ? 0 : value;
    }

    /**
     * 获取非空值
     */
    public static long value(Long value) {
        return value == null ? 0 : value;
    }

    /**
     * 获取非空值
     */
    public static float value(Float value) {
        return value == null ? 0 : value;
    }

    /**
     * 获取非空值
     *
     */
    public static double value(Double value) {
        return value == null ? 0 : value;
    }
    //获取非基本类型对应基本类型的非空值 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    /**
     * index是否在arr长度范围内
     */
    public static boolean isIndexInRange(Integer index, Object[] array) {
        return index != null && index >= 0 && index < count(array);
    }

    /**
     * 获取在arr长度范围内的index
     * defaultIndex = 0
     */
    public static int getIndexInRange(Integer index, Object[] array) {
        return getIndexInRange(index, array, 0);
    }

    /**
     * 获取在arr长度范围内的index
     */
    public static int getIndexInRange(Integer index, Object[] array, int defaultIndex) {
        return isIndexInRange(index, array) ? index : defaultIndex;
    }

    /**
     * 获取在arr长度范围内的index
     * defaultIndex = 0
     *
     */
    public static <T> T getInRange(Integer index, T[] array) {
        return getInRange(index, array, 0);
    }

    /**
     * 获取在arr长度范围内的index
     *
     */
    public static <T> T getInRange(Integer index, T[] array, int defaultIndex) {
        return get(array, getIndexInRange(index, array, defaultIndex));
    }

}
